package com.ag.oa.core.dao;


import com.ag.oa.core.entity.vo.ProjectVO;
import com.ag.oa.core.entity.vo.UserVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * Author:   wjc
 * Date:     2021/10/18
 * Description:
 */
@Repository("projectDao")
public interface IProjectDao {

    /**
     * 创建项目
     */
    void createProject(ProjectVO projectVO);

    /**
     * 创建项目的人，就是第一个负责人
     */
    void createProjectFirstUser(ProjectVO projectVO);

    /**
     * 判断是否项目负责人的标识
     * @param projectId 项目id
     * @param userId 操作用户id
     * @return 返回数量大于0，表示该用户是这个项目的负责人
     */
    Integer getProjectManagerFlag(@Param("projectId") Integer projectId, @Param("userId") Integer userId);

    /**
     * 查询项目列表 (根据最后修改时间倒序)
     */
    List<ProjectVO> findProjectList(@Param("projectStatus") Integer projectStatus
            , @Param("projectUserId") Integer projectUserId, @Param("projectId") Integer projectId);

    /**
     * 根据id，查看项目详情
     */
    ProjectVO getProjectById(@Param("projectId") Integer projectId);

    /**
     * 根据用户 id 获取我的项目数据
     */
    List<Map> getUserProjectsData(@Param("userId") Integer userId, @Param("offset") Integer offset
            , @Param("pageSize") Integer pageSize);

    /**
     * 修改项目状态
     */
    void updateProjectStatus(ProjectVO vo);

    /**
     * 修改项目内容描述
     */
    void updateProjectDesc(ProjectVO vo);

    /**
     * 修改项目章程
     */
    void updateConstitution(ProjectVO vo);

    /**
     * 根据项目id，查询出所有负责人
     */
    List<ProjectVO> findProjectUserById(@Param("projectId") Integer projectId);

    /**
     * 根据项目id与用户id，删除项目负责人
     * 1. 项目发起人不允许删除
     */
    void deleteProjectUserById(@Param("projectId") Integer projectId, @Param("userId") Integer userId);

    /**
     * 添加项目负责人使用，初始化列表以及查询
     *
     * 1. 排除项目中已添加的负责人
     * 2. 项目负责人身份要求，会员 以及 决策用户都可以（vip大于0即可）
     * 3. 合格的用户（昵称、手机号符合规范的）
     */
    List<UserVO> getProjectUserCheckDataList(@Param("username") String username, @Param("projectId") Integer projectId
            , @Param("limitCount") Integer limitCount);

    /**
     * 创建项目负责人，可以同时添加多个负责人
     * 1. 项目id 与 负责人id 相同则忽略处理
     */
    void createProjectUsers(ProjectVO projectVO);

    List<Map> getAllMemberList(@Param("projectId") Integer projectId);

    /**
     * 可添加的社员列表信息
     *
     * 1. 排除teamTalk系统默认用户
     * 2. 合格的用户（昵称、手机号符合规范的）
     * @param users
     * @param offset
     * @param pageSize
     * @param username
     * @return
     */
    List<Map> getAddableMemberUsers(@Param("users") List<Object> users, @Param("offset") Integer offset
            , @Param("pageSize") Integer pageSize, @Param("username") String username);

    int getMemberUserCount(@Param("projectId") Integer projectId, @Param("userId") Object userId);

    void saveMemberUser(@Param("projectId") Integer projectId, @Param("userId") Object userId
            , @Param("createdBy") Integer createdBy, @Param("type") Integer type);

    int deleteMemberUser(@Param("projectId") Integer projectId, @Param("userId") Object userId);

    List<Map> getUserProjectsScoreList(@Param("userId") Object userId);

    List<Map> getUserProjectScoreRecordList(@Param("projectId") Integer projectId, @Param("userId") Object userId);

    Map<String, Object> getScoreDetailInfo(@Param("scoreId") Integer scoreId);

}
